package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar; 
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.ClienteEmpresaDao;
import com.pe.pgn.clubpgn.dao.SincronizacionFlotaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbClienteEmpresa;
import com.pe.pgn.clubpgn.domain.ClpdFlota;
import com.pe.pgn.clubpgn.domain.ClpdLineaCredito;
import com.pe.pgn.clubpgn.domain.ClpdTope;
import com.pe.pgn.clubpgn.domain.ClprClienteEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNClienteEmpresa;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@SuppressWarnings("unchecked")
@Repository("clienteEmpresaDao")
public class ClienteEmpresaDaoImpl extends GenericDaoHibernate<ClpbClienteEmpresa, Long> 
	implements ClienteEmpresaDao{
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public ClienteEmpresaDaoImpl() {
		super(ClpbClienteEmpresa.class);
	}	
	
	public List<BNClienteEmpresa> busquedaClientesPorFiltros(
			String deClienteEmpresa, String coRuc, Long lineaCreditoMinima,
			Long lineaCreditoMaxima, String coTipoLineaCredito, String habilitado) {
		
		StringBuffer sql = new StringBuffer();
		sql.append(" select cliente.id as id, ");
		sql.append(" cliente.co_ruc as coRuc, ");
		sql.append(" cliente.de_cliente_empresa as deClienteEmpresa, ");
		sql.append(" cliente.de_alias as deAlias, ");
		sql.append(" cliente.de_email_notificacion_1 as deEmailNotificacion1, ");
		sql.append(" cliente.de_email_notificacion_2 as deEmailNotificacion2, ");
		sql.append(" cliente.st_cliente_empresa as habilitado, ");
		sql.append(" linea.co_tipo_linea_credito as coTipoLineaCredito, ");
		sql.append(" linea.va_linea_credito as vaLineaCredito, ");
		sql.append(" linea.va_saldo_linea_credito as vaSaldoLineaCredito ");
		sql.append(" from clpb_cliente_empresa cliente ");
		
		sql.append(" left join clpd_linea_credito linea ");
		sql.append(" on linea.co_cliente_empresa = cliente.id  ");
		sql.append(" where 1 = 1 ");
		
		sql.append(" and (linea.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"' or linea.st_linea_credito is null) ");
		
		if(StringUtils.isNotBlank(deClienteEmpresa.trim()))
			sql.append(" and upper(trim(cliente.de_cliente_empresa)) like upper(trim('%"+deClienteEmpresa.trim()+"%')) ");
		
		if(StringUtils.isNotBlank(coRuc.trim()))
			sql.append(" and upper(trim(cliente.co_ruc)) like upper(trim('%"+coRuc.trim()+"%')) ");
				
		if(StringUtils.isNotBlank(habilitado)&& !habilitado.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS))
			sql.append(" and cliente.st_cliente_empresa='"+habilitado+"' ");
		
		if(StringUtils.isNotBlank(coTipoLineaCredito))
			sql.append(" and linea.co_tipo_linea_credito='"+coTipoLineaCredito+"' ");

		if(null != lineaCreditoMinima) {
			sql.append(" and va_linea_credito >= ").append(lineaCreditoMinima);
		}
			
		if(null != lineaCreditoMaxima){
			sql.append(" and va_linea_credito <= ").append(lineaCreditoMaxima);
		}
		
		sql.append(" order by cliente.id desc ");
		
		System.out.println(sql.toString());
		List<BNClienteEmpresa> listaClientes= findListOfBeans(sql.toString(), null, BNClienteEmpresa.class);
		return listaClientes;
	}
	
	 
	public List<BNClienteEmpresa> busquedaClientesWizzar(
			String deClienteEmpresa, String coRuc, String deAlias,
			String habilitado) {
		StringBuffer sql= new StringBuffer();
		sql.append(" select cliente.id as id, ");
		sql.append(" cliente.co_ruc as coRuc, ");
		sql.append(" cliente.de_cliente_empresa as deClienteEmpresa, ");
		sql.append(" cliente.de_alias as deAlias, ");
		sql.append(" cliente.de_email_notificacion_1 as deEmailNotificacion1, ");
		sql.append(" cliente.de_email_notificacion_2 as deEmailNotificacion2, ");
		sql.append(" cliente.st_cliente_empresa as habilitado, ");
		sql.append(" linea.co_tipo_linea_credito as coTipoLineaCredito, ");
		sql.append(" linea.va_linea_credito as vaLineaCredito ");
		sql.append(" from clpb_cliente_empresa cliente ");
		sql.append(" JOIN  clpd_linea_credito linea  ");
		sql.append(" on linea.co_cliente_empresa = cliente.id  ");
		sql.append(" where 1=1 ");
		
		if(StringUtils.isNotBlank(deClienteEmpresa)){
			sql.append(" and upper(trim(cliente.de_cliente_empresa)) like upper(trim('%"+deClienteEmpresa+"%')) ");
		}			
		
		if(StringUtils.isNotBlank(coRuc)){
			sql.append(" and upper(trim(cliente.co_ruc)) like upper(trim('%"+coRuc.trim()+"%')) ");
		}

		if(StringUtils.isNotBlank(deAlias)){
			sql.append(" and upper(cliente.de_alias) like upper(trim('%"+deAlias+"%')) ");
		}
					
		if ("Y".equalsIgnoreCase(habilitado)) 						
			sql.append(" and cliente.st_cliente_empresa='"+CLPConstantes.ST_VERDADERO+"' ");
		if ("N".equalsIgnoreCase(habilitado)) 						
			sql.append(" and cliente.st_cliente_empresa='"+CLPConstantes.ST_FALSO+"' ");
				
		sql.append(" and linea.st_linea_credito ='"+CLPConstantes.ST_VERDADERO+"' ");
		sql.append(" ORDER BY cliente.de_cliente_empresa ASC");
		System.out.println(sql.toString());
		List<BNClienteEmpresa> listaClientes= findListOfBeans(sql.toString(), null, BNClienteEmpresa.class);
		return listaClientes;
	}

	public void eliminarClienteEmpresa(Long id) {
		
		StringBuffer query = new StringBuffer();
		//ELIMINA CLIENTE EMPRESA
		query.append(" update clpb_cliente_empresa ");
		query.append(" set ");
		query.append(" 		st_cliente_empresa  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  id = ").append(id);
		jdbcTemplate.update(query.toString());		

		//ELIMINA LINEA DE CREDITO
		query = new StringBuffer();
		query.append(" update clpd_linea_credito set ");
		query.append("		st_linea_credito = '").append(CLPConstantes.ST_FALSO).append("', ");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append("	where co_cliente_empresa = ").append(id);
		jdbcTemplate.update(query.toString());		
		
		//ELIMINA FLOTA
		query = new StringBuffer();
		query.append(" update clpd_flota ");
		query.append(" set ");
		query.append(" 		st_flota  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  co_cliente_empresa = ").append(id);
		jdbcTemplate.update(query.toString());		
		
		StringBuffer queryFlotasId = new StringBuffer();
		queryFlotasId.append("select id from clpd_flota where co_cliente_empresa =").append(id);

		StringBuffer queryFlotasVehiculoId = new StringBuffer();
		queryFlotasVehiculoId.append("select id from clpr_flota_vehiculo where co_flota in (").append(queryFlotasId).append(")");
		
		//ELIMINA FLOTA VEHICULO
		query = new StringBuffer();
		query.append(" update clpr_flota_vehiculo ");
		query.append(" set ");
		query.append(" 		st_flota_vehiculo  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  co_flota in (").append(queryFlotasId).append(")");
		jdbcTemplate.update(query.toString());		

		//ELIMINA TARJETA
		query = new StringBuffer();
		query.append(" update clpb_tarjeta_empresa ");
		query.append(" set ");
		query.append(" 		st_tarjeta_empresa  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  co_flota_vehiculo in (").append(queryFlotasVehiculoId).append(")");
		jdbcTemplate.update(query.toString());		

		//ELIMINA TOPE
		query = new StringBuffer();
		query.append(" update clpd_tope ");
		query.append(" set ");
		query.append(" 		st_tope  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  co_cliente_empresa = ").append(id);
		jdbcTemplate.update(query.toString());
		
		//ELIMINA CLIENTE_ESTACION
		query = new StringBuffer();
		query.append(" update clpr_cliente_estacion ");
		query.append(" set ");
		query.append(" 		st_cliente_estacion  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append("  co_cliente_empresa = ").append(id);
		jdbcTemplate.update(query.toString());		
		
		getHibernateTemplate().flush();
		
	}

	public void guardarClienteEmpresa(ClpbClienteEmpresa clienteEmpresa) {
		
		boolean darDeBaja = false;
		if(clienteEmpresa.getId() != null){
			
			StringBuffer query = new StringBuffer();
			query.append("select st_cliente_empresa from clpb_cliente_empresa where id = ").append(clienteEmpresa.getId());
			
			String stClienteEmpresa = jdbcTemplate.queryForObject(query.toString(), String.class);
			if(!clienteEmpresa.isStClienteEmpresa() && stClienteEmpresa.equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
				darDeBaja = true;
			}
		}
		
		if(darDeBaja){			
			eliminarClienteEmpresa(clienteEmpresa.getId());
		}else{
			if(clienteEmpresa.getId() == null){				
				clienteEmpresa.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				clienteEmpresa.setDaFechaCreacion(Calendar.getInstance());
			}else{
				clienteEmpresa.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
				clienteEmpresa.setDaFechaModificacion(Calendar.getInstance());			
			}

			getHibernateTemplate().saveOrUpdate(clienteEmpresa);
		}
		
		getHibernateTemplate().flush();
	}

	public void guardarClienteEmpresaEstaciones(ClpbClienteEmpresa clienteempresa) {
		
		List<ClprClienteEstacion> listEstacion = clienteempresa.getClienteEstaciones();
		Long coClienteEmpresa = clienteempresa.getId();
		
		int indice = 0;
		StringBuffer query = new StringBuffer();
		String[] arrayStr  = new String[listEstacion.size()];
		
		for (int i = 0; i < listEstacion.size();i++){
			
			ClprClienteEstacion estacion = listEstacion.get(i);			
			estacion.setCoClienteEmpresa(coClienteEmpresa);
			
			if (!"".equals(estacion.getHabilitado())){
				if (null == estacion.getId()){
					
					query = new StringBuffer();
					query.append(" insert into clpr_cliente_estacion ");
					query.append(" (id,co_cliente_empresa,co_estacion,co_usuario_creador,");
					query.append("  co_usuario_modificador,da_fecha_creacion,da_fecha_modificacion,st_cliente_estacion) ");
					query.append("  values (seq_cliente_estacion.nextVal, "+coClienteEmpresa+", "+estacion.getCoEstacion()+",");
					query.append("  '"+getUsuarioLogueado().getUsername()+"', null, sysdate, null, '"+estacion.getHabilitado().toUpperCase()+"')");
					
					arrayStr[indice] = query.toString();
					indice++;
					
				} else {

					query = new StringBuffer();
					query.append(" update clpr_cliente_estacion ");
					query.append(" set co_usuario_modificador = '"+getUsuarioLogueado().getUsername()+"',");
					query.append("     da_fecha_modificacion = sysdate,");
					query.append("     st_cliente_estacion = '"+estacion.getHabilitado().toUpperCase()+"'");
					query.append(" where id = "+estacion.getId());
					
					arrayStr[indice] = query.toString();
					indice++;
				}
			}else{
				
				arrayStr[indice] = ValidationUtil.getQueryDefault();
				indice++;
			}					
		}
		
		if(arrayStr.length > 0)
		jdbcTemplate.batchUpdate(arrayStr);
		
		for (int i = 0; i < arrayStr.length; i++) {
			System.out.println(i+"* guardarClienteEmpresaEstaciones(): "+arrayStr[i]);
		}
	}

	public void guardarClienteEmpresaTopes(
		ClpbClienteEmpresa clienteempresa) {
		
		if (null == clienteempresa.getTope().getId()){
			
			ClpdTope bntope = new ClpdTope();
			bntope.setStEnviado(setearEnviadoSegunTopes(clienteempresa));			
			bntope.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			bntope.setDaFechaCreacion(Calendar.getInstance());
			bntope.setCoClienteEmpresa(clienteempresa.getId());
			bntope.setDeTope(clienteempresa.getTope().getDeTope());
			bntope.setStTipoTope(clienteempresa.getTope().getStTipoTope());
			bntope.setVaPorcentaje(clienteempresa.getTope().getVaPorcentaje());
			bntope.setStTope(Boolean.TRUE);
			getHibernateTemplate().saveOrUpdate(bntope);
		} 	

		getHibernateTemplate().flush();		
	}
	
	
	private Boolean setearEnviadoSegunTopes(ClpbClienteEmpresa clienteempresa) {

		Boolean isEnviado = Boolean.FALSE;
		ClpdTope bntope = clienteempresa.getTope();
		
		StringBuffer query = new StringBuffer();
		query.append(" select tp.st_enviado, tp.st_tipo_tope ");
		query.append(" from clpd_tope tp ");
		query.append(" where tp.va_porcentaje >= ").append(bntope.getVaPorcentaje());
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" where tp.co_cliente_empresa = ").append(clienteempresa.getId());
		query.append(" order by tp.va_porcentaje desc ");
		
		List list = jdbcTemplate.queryForList(query.toString());
		if(ValidationUtil.validateList(list)){
			for (int i = 0; i < list.size(); i++) {
				
				Map map = (Map)list.get(i);
				String stEnviado = String.valueOf(map.get("st_enviado"));
				if(stEnviado.equals(CLPConstantes.ST_VERDADERO)){
					isEnviado = Boolean.TRUE;
					break;
				}
			}			
		}
		
		return isEnviado;
	}

	public void eliminarTope(Long id) {
		StringBuffer query = new StringBuffer();
		query.append(" update clpd_tope ");
		query.append(" set ");
		query.append(" 		st_tope  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where 1 = 1  ");
		query.append(" and id= ").append(id);
		query.append(" and st_tope='"+CLPConstantes.ST_VERDADERO+"' ");
		
		jdbcTemplate.update(query.toString());
		getHibernateTemplate().flush();
		
	}

	public BNClienteEmpresa obtenerClienteEmpresaTope(Long id) {
		ClpbClienteEmpresa empresa= get(id);
		
		BNClienteEmpresa bean= new BNClienteEmpresa();
		
		if (empresa.isStClienteEmpresa() == true) {
			StringBuffer query = new StringBuffer();
			query.append(" select   ");		  
			query.append("  tope.id as id,");
			query.append("  tope.de_tope as deTope,");
			query.append("  tope.st_tipo_tope as stTipoTope,");
			query.append("  tope.co_cliente_empresa as coClienteEmpresa,");
			query.append("  tope.va_porcentaje as vaPorcentaje,");
			query.append("  tope.st_tope as habilitado");
			query.append("	from clpd_tope tope ");
			query.append("		where 1 = 1 ");
			query.append("  		and tope.st_tope = '"+CLPConstantes.ST_VERDADERO+"'  ");
			query.append(" 			and tope.co_cliente_empresa = ").append(id);
			query.append(" ORDER BY tope.id  ");
			System.out.println(query.toString());
			List<ClpdTope> listClpdTope = findListOfBeans(query.toString(), null,ClpdTope.class);
			if(!listClpdTope.isEmpty()){
				empresa.setTopes(listClpdTope);
			}				
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 linea.id  as id ,");
			query.append(" 	 linea.co_cliente_empresa  as coClienteEmpresa ,");
			query.append(" 	 linea.va_linea_credito  as vaLineaCredito ,");
			query.append(" 	 linea.va_saldo_linea_credito  as vaSaldoLineaCredito ,");		
			query.append(" to_char(linea.da_fecha_inicio_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaInicioContrato, ");
			query.append(" to_char(linea.da_fecha_fin_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaFinContrato, ");
			query.append(" to_char(linea.da_fecha_operacion,'"+CLPConstantes.DATE_PATTERN+"') as fechaOperacion, ");
			query.append(" 	 linea.co_tipo_linea_credito  as coTipoLineaCredito ");
			query.append(" from clpd_linea_credito linea ");		
			query.append(" where 1 = 1 ");		
			query.append(" and linea.st_linea_credito='"+CLPConstantes.ST_VERDADERO+"' ");
			query.append(" and linea.co_cliente_empresa = ").append(empresa.getId());
			
			System.out.println(query.toString());
			List<ClpdLineaCredito> list = findListOfBeans(query.toString(), null, ClpdLineaCredito.class);
			if(!list.isEmpty()){
				bean.setLineaCredito(list.get(0));
			}					
		} else {
			
			StringBuffer query = new StringBuffer();
			query.append(" select   ");		  
			query.append("  tope.id as id,");
			query.append("  tope.de_tope as deTope,");
			query.append("  tope.st_tipo_tope as stTipoTope,");
			query.append("  tope.co_cliente_empresa as coClienteEmpresa,");
			query.append("  tope.va_porcentaje as vaPorcentaje,");
			query.append("  tope.st_tope as habilitado");
			query.append("	from clpd_tope tope ");
			query.append("		where 1 = 1 ");			
			query.append(" 			and tope.co_cliente_empresa = ").append(id);
			query.append(" ORDER BY tope.id  ");
			System.out.println(query.toString());
			List<ClpdTope> listClpdTope = findListOfBeans(query.toString(), null,ClpdTope.class);
			if(!listClpdTope.isEmpty()){
				empresa.setTopes(listClpdTope);
			}				
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 linea.id  as id ,");
			query.append(" 	 linea.co_cliente_empresa  as coClienteEmpresa ,");
			query.append(" 	 linea.va_linea_credito  as vaLineaCredito ,");
			query.append(" 	 linea.va_saldo_linea_credito  as vaSaldoLineaCredito ,");		
			query.append(" to_char(linea.da_fecha_inicio_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaInicioContrato, ");
			query.append(" to_char(linea.da_fecha_fin_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaFinContrato, ");
			query.append(" to_char(linea.da_fecha_operacion,'"+CLPConstantes.DATE_PATTERN+"') as fechaOperacion, ");
			query.append(" 	 linea.co_tipo_linea_credito  as coTipoLineaCredito ");
			query.append(" from clpd_linea_credito linea ");		
			query.append(" where 1 = 1 ");		
			query.append(" and linea.st_linea_credito='"+CLPConstantes.ST_VERDADERO+"' ");
			query.append(" and linea.co_cliente_empresa = ").append(empresa.getId());
			
			System.out.println(query.toString());
			List<ClpdLineaCredito> list = findListOfBeans(query.toString(), null, ClpdLineaCredito.class);
			if(!list.isEmpty()){
				bean.setLineaCredito(list.get(0));
			}		
			
		}
		
		BeanUtils.copyProperties(empresa,bean);		
		return bean;
	}	
	
	public BNClienteEmpresa obtenerClienteEmpresa(Long clienteEmpresaID, Long flotaID) {
		
		ClpbClienteEmpresa empresa = get(clienteEmpresaID);
		BNClienteEmpresa bean = new BNClienteEmpresa();

		if (empresa.isStClienteEmpresa()){
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 	linea.id  as id ,");
			query.append(" 	 	linea.co_cliente_empresa  as coClienteEmpresa ,");
			query.append(" 	 	linea.va_linea_credito  as vaLineaCredito ,");
			query.append(" 	 	linea.va_saldo_linea_credito  as vaSaldoLineaCredito ,");		
			query.append(" 		to_char(linea.da_fecha_inicio_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaInicioContrato, ");
			query.append(" 		to_char(linea.da_fecha_fin_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaFinContrato, ");
			query.append(" 		to_char(linea.da_fecha_operacion,'"+CLPConstantes.DATE_PATTERN+"') as fechaOperacion, ");
			query.append(" 	 		linea.co_tipo_linea_credito  as coTipoLineaCredito ");
			query.append(" from clpd_linea_credito linea ");		
			query.append(" where linea.st_linea_credito='"+CLPConstantes.ST_VERDADERO+"' ");
			query.append(" 		and linea.co_cliente_empresa = ").append(empresa.getId());
			
			List<ClpdLineaCredito> list = findListOfBeans(query.toString(), null, ClpdLineaCredito.class);
			if(!list.isEmpty()){
				bean.setLineaCredito(list.get(0));
			}		
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 flota.id  as id ,");
			query.append(" 	 flota.de_flota_area as deFlotaArea ,");
			query.append(" 	 flota.co_cliente_empresa  as coClienteEmpresa, ");
			query.append(" 	 (select count(flota_vehiculo.id) from clpr_flota_vehiculo flota_vehiculo where flota_vehiculo.st_flota_vehiculo = '"+CLPConstantes.ST_VERDADERO+"'  and flota_vehiculo.co_flota = flota.id ) as vaTamano  ");
			query.append(" from clpd_flota flota ");		
			query.append(" where flota.co_cliente_empresa = ").append(empresa.getId());
			query.append(" 		and flota.st_flota='"+CLPConstantes.ST_VERDADERO+"' ");
			
			List<ClpdFlota> listClpdFlota = findListOfBeans(query.toString(), null, ClpdFlota.class);
			if(!listClpdFlota.isEmpty()){
				bean.setFlotas(listClpdFlota);
			}				
			
			BeanUtils.copyProperties(empresa,bean);
			
		} else {
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 	linea.id  as id ,");
			query.append(" 	 	linea.co_cliente_empresa  as coClienteEmpresa ,");
			query.append(" 	 	linea.va_linea_credito  as vaLineaCredito ,");
			query.append(" 	 	linea.va_saldo_linea_credito  as vaSaldoLineaCredito ,");		
			query.append(" 		to_char(linea.da_fecha_inicio_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaInicioContrato, ");
			query.append(" 		to_char(linea.da_fecha_fin_contrato,'"+CLPConstantes.DATE_PATTERN+"') as fechaFinContrato, ");
			query.append(" 		to_char(linea.da_fecha_operacion,'"+CLPConstantes.DATE_PATTERN+"') as fechaOperacion, ");
			query.append(" 	 	linea.co_tipo_linea_credito  as coTipoLineaCredito ");
			query.append(" 	from clpd_linea_credito linea ");		
			query.append(" 	where linea.st_linea_credito='"+CLPConstantes.ST_VERDADERO+"' ");
			query.append(" 		and linea.co_cliente_empresa = ").append(empresa.getId());
			query.append("	order by linea.da_fecha_creacion desc 	");
			
			List<ClpdLineaCredito> list = findListOfBeans(query.toString(), null, ClpdLineaCredito.class);
			if(!list.isEmpty()){
				bean.setLineaCredito(list.get(0));
			}		
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 flota.id  as id ,");
			query.append(" 	 flota.de_flota_area as deFlotaArea ,");
			query.append(" 	 flota.co_cliente_empresa  as coClienteEmpresa, ");
			query.append(" 	 (select count(flota_vehiculo.id) from clpr_flota_vehiculo flota_vehiculo where flota_vehiculo.co_flota = flota.id ) as vaTamano  ");
			query.append(" from clpd_flota flota ");		
			query.append(" where flota.co_cliente_empresa = ").append(empresa.getId());
			
			List<ClpdFlota> listClpdFlota = findListOfBeans(query.toString(), null, ClpdFlota.class);
			if(!listClpdFlota.isEmpty()){
				bean.setFlotas(listClpdFlota);
			}				
			
			BeanUtils.copyProperties(empresa,bean);
			
		}		
		
		///////////////////////////////////
		///// obteniendo datos de tope rojo
		///////////////////////////////////
		
		StringBuffer query  = new StringBuffer();
		query.append(" select distinct ");
		query.append(" tp.va_porcentaje, tp.de_tope ");
		query.append(" from clpd_tope tp ");		
		query.append(" where tp.co_cliente_empresa = ").append(clienteEmpresaID);
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" and tp.st_tipo_tope = '"+CLPConstantes.ST_ROJO+"'");		
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		
		if(!list.isEmpty()){
			
			Map<String, Object> objMap = list.get(0);
			String deTope = objMap.get("de_tope").toString();
			BigDecimal vaPercentage = new BigDecimal(objMap.get("va_porcentaje").toString());
			bean.setVaPercentage(vaPercentage);
			bean.setDeTope(deTope);			
		}
		
		return bean;
	}

	public BNClienteEmpresa obtenerClienteEmpresaEstacion(Long id) {
		
		ClpbClienteEmpresa empresa= get(id);
		
		BNClienteEmpresa bean= new BNClienteEmpresa();
		
		StringBuffer query = new StringBuffer();
		query.append("select ce.id as id, ");
		query.append("		e.co_codigo_cofide as coCodigoCofide, ");
		query.append("		e.de_estacion as deEstacion, ");
		query.append("		e.id as coEstacion, ");
		query.append("		ce.st_cliente_estacion as habilitado, ");
		query.append("		a.id as coAlmacen, ");
		query.append("		a.st_almacen as stAlmacen, ");
		query.append("		a.st_es_almacen_principal as stEsAlmacenPrincipal, ");
		query.append("		a.st_es_almacen_virtual as stAlmacenVirtual, ");
		query.append("		a.st_es_punto_canje as stEsPuntoCanje ");
		query.append("	from clpr_cliente_estacion ce join clpb_estacion e on ce.co_estacion = e.id ");
		query.append("           left outer join clpb_almacen a on e.id = a.co_estacion  ");
		query.append("	where ce.co_cliente_empresa = ").append(id);
		
		if (!empresa.isStClienteEmpresa()){
			
			query.append(" and ce.st_cliente_estacion = '").append(CLPConstantes.ST_FALSO).append("'");
		}
		else{
			
			query.append(" and e.st_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");			
			query.append(" and ce.st_cliente_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		}
		query.append(" order by e.de_estacion asc ");
				
		List<ClprClienteEstacion> listClienteEstacion = findListOfBeans(query.toString(), null,ClprClienteEstacion.class);
		listClienteEstacion = depurarListaDeAlmacenVirtualYPrincipal(listClienteEstacion);
		String ids = obtenerIdsEstacionesParaClienteEmpresa(listClienteEstacion);
		
		query = new StringBuffer();
		query.append("select e.co_codigo_cofide as coCodigoCofide,  ");
		query.append("		e.de_estacion as deEstacion,  ");
		query.append("		e.id as coEstacion,  ");
		query.append("		a.id as coAlmacen, ");
		query.append("		a.st_almacen as stAlmacen,  ");
		query.append("		a.st_es_almacen_principal as stEsAlmacenPrincipal,  ");
		query.append("		a.st_es_almacen_virtual as stAlmacenVirtual,  ");
		query.append("		a.st_es_punto_canje as stEsPuntoCanje ");
		query.append("	from clpb_estacion e left outer join clpb_almacen a on e.id = a.co_estacion   ");
		query.append("	where e.st_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");		
		
		if(StringUtils.isNotBlank(ids)){
			
			query.append("	and e.id not in (").append(ids).append(") ");
		}
		query.append(" order by e.de_estacion asc ");
		
		List<ClprClienteEstacion> listaEstaciones = findListOfBeans(query.toString(), null,ClprClienteEstacion.class);
		listaEstaciones = depurarListaDeAlmacenVirtualYPrincipal(listaEstaciones);
		listClienteEstacion.addAll(listaEstaciones);
		
		if(!listClienteEstacion.isEmpty()){
			empresa.setClienteEstaciones(listClienteEstacion);
		}		

		BeanUtils.copyProperties(empresa, bean);
		return bean;
	}
	
	private List<ClprClienteEstacion> depurarListaDeAlmacenVirtualYPrincipal(List<ClprClienteEstacion> listClienteEstacion){
		
		List<ClprClienteEstacion> listaClienteEstacionDepurada = new ArrayList<ClprClienteEstacion>();
		if(!listClienteEstacion.isEmpty()){

			for (ClprClienteEstacion clienteEstacion : listClienteEstacion) {
				
				if(clienteEstacion.getCoAlmacen() == null){
					
					listaClienteEstacionDepurada.add(clienteEstacion);
				}
				else if(!clienteEstacion.getStAlmacenVirtual().equalsIgnoreCase(CLPConstantes.ST_VERDADERO)
						 && !clienteEstacion.getStEsAlmacenPrincipal().equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
					
					listaClienteEstacionDepurada.add(clienteEstacion);
				}
			}			
		}
		return listaClienteEstacionDepurada;
	}
	
	private String obtenerIdsEstacionesParaClienteEmpresa(List<ClprClienteEstacion> listClienteEstacion){
		
		String ids = "";
		if(!listClienteEstacion.isEmpty()){

			for (ClprClienteEstacion clienteEstacion : listClienteEstacion) {

				ids = ids.concat(clienteEstacion.getCoEstacion()).concat(CLPConstantes.CARACTER_COMA);
			}			
		}

		if(ids.endsWith(CLPConstantes.CARACTER_COMA)){
			ids = ids.substring(0, ids.length() - 1);
		}

		return ids;
	}
	
	public List<BNClienteEmpresa> obtenerClienteEmpresas(boolean esInicial) {
		StringBuffer sql = new StringBuffer();
		sql.append(" select * from ( ");

		sql.append(" select cliente.id as id, ");
		sql.append(" cliente.co_ruc as coRuc, ");
		sql.append(" cliente.de_cliente_empresa as deClienteEmpresa, ");
		sql.append(" cliente.de_alias as deAlias, ");
		sql.append(" cliente.de_email_notificacion_1 as deEmailNotificacion1, ");
		sql.append(" cliente.de_email_notificacion_2 as deEmailNotificacion2, ");
		sql.append(" cliente.st_cliente_empresa as habilitado, ");
		sql.append(" linea.co_tipo_linea_credito as coTipoLineaCredito, ");
		sql.append(" linea.va_linea_credito as vaLineaCredito, ");
		sql.append(" linea.va_saldo_linea_credito as vaSaldoLineaCredito ");
		sql.append(" from clpb_cliente_empresa cliente ");
		
		sql.append(" left join clpd_linea_credito linea ");		
		sql.append(" on linea.co_cliente_empresa = cliente.id  ");
		sql.append(" where 1 = 1 ");
		
		sql.append(" and (linea.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"' or linea.st_linea_credito is null) ");
		
		if(!esInicial)
		sql.append(" and cliente.st_cliente_empresa ='"+CLPConstantes.ST_VERDADERO+"' ");
		
	    sql.append(" order by cliente.id desc) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL_EXTRA);		
		return findListOfBeans(sql.toString(), null, BNClienteEmpresa.class);
	}

	
	public int validaAlias(String coAlias) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append("  ");
		query.append(" from clpb_cliente_empresa ");
		query.append(" where trim( upper(DE_ALIAS))		='"+coAlias.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}

	public int validaRazonSocial(String deClienteEmpresa) {
		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append("  ");
		query.append(" from clpb_cliente_empresa ");
		query.append(" where trim( upper(DE_CLIENTE_EMPRESA))		='"+deClienteEmpresa.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}	

	public int validaRuc(String coRuc) {
		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append("  ");
		query.append(" from clpb_cliente_empresa ");
		query.append(" where trim( upper(CO_RUC))		='"+coRuc.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}
	
	
	public int validaAlias(Long id,String coAlias) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append("  ");
		query.append(" from clpb_cliente_empresa ");
		query.append(" where id		<> "+id+" ");
		query.append(" and trim( upper(DE_ALIAS))		='"+coAlias.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}
	
	public int validaRazonSocial(Long id,String deClienteEmpresa) {
		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append("  ");
		query.append(" from clpb_cliente_empresa ");
		query.append(" where id		<> "+id+" ");
		query.append(" and trim( upper(DE_CLIENTE_EMPRESA))		='"+deClienteEmpresa.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}
	
	public int validaRuc(Long id, String coRuc) {
		StringBuffer query = new StringBuffer();
		query.append(" select id ");	
		query.append(" from clpb_cliente_empresa ");
		query.append(" where id		<> "+id+" ");		
		query.append(" and trim( upper(CO_RUC))		='"+coRuc.toUpperCase().trim()+"' ");
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			return list.size();
		}
		return 0;
	}

	public ClprClienteEstacion obtenerClienteEstacion(Long id) {
	
		Criteria criteria = DetachedCriteria.forClass(ClprClienteEstacion.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("id", id));
		List<ClprClienteEstacion> lista = criteria.list();
		if(!lista.isEmpty()){
			return lista.get(0);
		}
		return null;
	}

	public ClpbClienteEmpresa obtenerClienteEmpresaByID(Long id) {
		return get(id);
	}

	public BNClienteEmpresa obtenerBNClienteEmpresaByID(Long clienteEmpresaID) {

		ClpbClienteEmpresa empresa = get(clienteEmpresaID);
		BNClienteEmpresa bean = new BNClienteEmpresa();
		BeanUtils.copyProperties(empresa,bean);		
		return bean;
	}

	public String verificarTopes(ClpbClienteEmpresa clienteEmpresa, 
		SincronizacionFlotaDao sincronizacionFlotaDao) {

		Long idClienteEmpresa 	= clienteEmpresa.getId();
		String deClienteEmpresa = clienteEmpresa.getDeClienteEmpresa();
		String deEmailNotificacion1 = clienteEmpresa.getDeEmailNotificacion1();
		String deEmailNotificacion2 = clienteEmpresa.getDeEmailNotificacion2();
		
		Map<String, Object> map = verificarTopeRojo(idClienteEmpresa, deEmailNotificacion1, 
		deEmailNotificacion2, deClienteEmpresa, sincronizacionFlotaDao);
		
		String mensaje 	 = map.get("mensaje").toString();
		String indicador = map.get("indicador").toString();
		
		//frk: si entra aca quiere decir que no hubo tope rojo
		if(indicador.equals(CLPConstantes.ST_OK)){
			
			mensaje = verificarTopesVerdeAmbar(idClienteEmpresa, 
			deEmailNotificacion1, deEmailNotificacion2, deClienteEmpresa);			
		}
		
		return mensaje;
	}
	
	private Map<String, Object> verificarTopeRojo(Long idClienteEmpresa,
			String deEmailNotificacion1, String deEmailNotificacion2,
			String deClienteEmpresa, SincronizacionFlotaDao sincronizacionFlotaDao) {

		String mensaje = "";
		String indicador = CLPConstantes.ST_OK;	
		StringBuffer query  = new StringBuffer();
		Map<String, Object> map = new HashMap<String, Object>();
		
		query.append(" select distinct ");
		query.append(" 	tp.id as id_tope, ");
		query.append(" 	tp.va_porcentaje, tp.de_tope,");
		query.append("	lc.va_saldo_linea_credito, ");
		query.append("  lc.va_linea_credito, tp.st_tipo_tope ");
		query.append(" from clpd_tope tp ");
		query.append(" join clpd_linea_credito lc ");
		query.append(" on lc.co_cliente_empresa = tp.co_cliente_empresa ");
		
		query.append(" where tp.co_cliente_empresa = ").append(idClienteEmpresa);
		query.append(" and lc.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" and tp.st_tipo_tope = '"+CLPConstantes.ST_ROJO+"'");
		
		System.out.println("* ClienteEmpresaDaoImpl.verificarTopeRojo() : "+query.toString());
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		System.out.println("* ClienteEmpresaDaoImpl.verificarTopeRojo - list : "+list);
		
		if(!list.isEmpty()){
				
			//frk: siempre solo va existir un tope rojo
			Map<String, Object> objMap = list.get(0);
			String deTope = objMap.get("de_tope").toString();
			String tipoTope = objMap.get("st_tipo_tope").toString();
			String idTope = String.valueOf(objMap.get("ID_TOPE"));
			double porcentaje = Double.parseDouble(objMap.get("va_porcentaje").toString());
			double lineacredito = Double.parseDouble(objMap.get("va_linea_credito").toString());
			double saldo_lineacredito = Double.parseDouble(objMap.get("va_saldo_linea_credito").toString());
			
			double cantidadtope = (porcentaje * lineacredito) / 100;
			double cantconsumida = lineacredito - saldo_lineacredito;
			
			if(cantconsumida >= cantidadtope){
				indicador = CLPConstantes.ST_ERROR;
				updateEnviadoTope(idTope);
				
				mensaje = " / La cantidad consumida es mayor o igual al tope "+deTope+", "+
				"se bloquearan las tarjetas del cliente con id="+idClienteEmpresa+"./";				
				mensaje += updateTarjetasBloqueadasByIDClienteEmpresa(idClienteEmpresa);
				
				enviarNotificacionTope(deEmailNotificacion1,deEmailNotificacion2,
				deClienteEmpresa,porcentaje,tipoTope,deTope,cantidadtope);	
				
				mensaje += sincronizacionFlotaDao.
				updateSyncPorTarjetasBloqueadas(idClienteEmpresa);
			}				
		}
		
		map.put("indicador", indicador);
		map.put("mensaje", mensaje);
		return map;
	}
	
	private String updateTarjetasBloqueadasByIDClienteEmpresa(
			Long idClienteEmpresa) {

		try{
		
			StringBuffer query = new StringBuffer();
			query.append(" select distinct ");
			query.append(" fv.id ");
			query.append(" from clpr_flota_vehiculo fv ");
			query.append(" join clpd_flota f on fv.co_flota = f.id  ");
			query.append(" join clpb_cliente_empresa ce on f.co_cliente_empresa = ce.id  ");
			query.append(" where f.co_cliente_empresa  = ").append(idClienteEmpresa);
			query.append(" and ce.st_cliente_empresa = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			query.append(" and fv.st_flota_vehiculo = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			query.append(" and f.st_flota = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			
			String strCodesFlota  = "";
			List<BigDecimal> list = jdbcTemplate.queryForList(query.toString(), BigDecimal.class);
			if(!list.isEmpty()){
				for (int i = 0; i < list.size(); i++) {
					strCodesFlota = strCodesFlota + list.get(i) + ",";							
				}
				
				strCodesFlota = strCodesFlota.substring(0, 
				strCodesFlota.length()-1);
				
				query  = new StringBuffer();
				query.append(" update clpb_tarjeta_empresa ");
				query.append(" set st_bloqueado = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" where co_flota_vehiculo in (").append(strCodesFlota).append(")");
				query.append(" and st_tarjeta_empresa  = '").append(CLPConstantes.ST_VERDADERO).append("'");
				jdbcTemplate.update(query.toString());
			
			}
			
			return "";
			
		}catch(Exception e){
			
			return "/ Hubo un error al bloquear las tarjetas: "+e.getCause().toString()+" /";
		}
	}
	
	private String verificarTopesVerdeAmbar(Long idClienteEmpresa, 
			String deEmailNotificacion1, String deEmailNotificacion2,
			String deClienteEmpresa) {

		String mensaje = "";
		StringBuffer query  = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 	tp.id as id_tope, tp.va_porcentaje, ");
		query.append("  tp.de_tope, lc.va_saldo_linea_credito, ");
		query.append("  lc.va_linea_credito, tp.st_tipo_tope, tp.st_enviado ");
		query.append(" from clpd_tope tp ");
		query.append(" join clpd_linea_credito lc ");
		query.append(" on lc.co_cliente_empresa = tp.co_cliente_empresa ");
		query.append(" where tp.co_cliente_empresa = ").append(idClienteEmpresa);
		query.append(" and lc.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" and tp.st_tipo_tope != '"+CLPConstantes.ST_ROJO+"'");
		query.append(" order by tp.va_porcentaje desc ");
		
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		if(!list.isEmpty()){
			for (int j = 0; j < list.size(); j++) {
				
				Map<String, Object> objMap = list.get(j);
				String deTope = objMap.get("DE_TOPE").toString();
				String tipoTope = objMap.get("ST_TIPO_TOPE").toString();
				String idTope = String.valueOf(objMap.get("ID_TOPE"));
				String stEnviado = String.valueOf(objMap.get("ST_ENVIADO"));
				double porcentaje = Double.parseDouble(objMap.get("VA_PORCENTAJE").toString());
				double lineacredito = Double.parseDouble(objMap.get("VA_LINEA_CREDITO").toString());
				double saldo_lineacredito = Double.parseDouble(objMap.get("VA_SALDO_LINEA_CREDITO").toString());
				
				double cantidadtope = (porcentaje * lineacredito) / 100;
				double cantconsumida = lineacredito - saldo_lineacredito;
				
				if(stEnviado.equals("null") || stEnviado.equals("")){					
					stEnviado = CLPConstantes.ST_FALSO;				
				}else if(stEnviado == CLPConstantes.ST_VERDADERO){
					break;
				}
				
				if(cantconsumida >= cantidadtope && stEnviado == CLPConstantes.ST_FALSO){
					updateEnviadoTope(idTope);					
					mensaje = " / La cantidad consumida es mayor o igual al tope "+deTope;				
					enviarNotificacionTope(deEmailNotificacion1,deEmailNotificacion2,
					deClienteEmpresa,porcentaje,tipoTope,deTope,cantidadtope);
					break;
				}
			}
		}
		
		return mensaje;
	}
	
	private void updateEnviadoTope(String idTope) {

		StringBuffer query  = new StringBuffer();
		query.append(" update clpd_tope ");
		query.append(" set st_enviado = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" where id = ").append(idTope);
		jdbcTemplate.update(query.toString());
	}
	
	private void enviarNotificacionTope(String deEmailNotificacion1,
			String deEmailNotificacion2, String deClienteEmpresa,
			double porcentaje, String tipoTope, String deTope,
			double cantidadtope) {

		try{
		
			SimpleJdbcCall spEnviarNotificacion = new SimpleJdbcCall(jdbcTemplate)
			.withProcedureName("SP_ENVIAR_NOTIFICACION");
			
			Map<String, Object> parametrosIngresoMap = new HashMap<String, Object>();
			parametrosIngresoMap.put("mailnotificacion1", deEmailNotificacion1);
			parametrosIngresoMap.put("mailnotificacion2", deEmailNotificacion2);
			parametrosIngresoMap.put("declienteempresa", deClienteEmpresa);
			parametrosIngresoMap.put("porcentajetope", porcentaje);
			parametrosIngresoMap.put("cantidadtope", cantidadtope);
			parametrosIngresoMap.put("sttipotope", tipoTope);			
			parametrosIngresoMap.put("detope", deTope);
			
			SqlParameterSource parametrosIngreso = new MapSqlParameterSource().
			addValues(parametrosIngresoMap);
			
			spEnviarNotificacion.execute(parametrosIngreso);	
			
		} catch (Exception e) {
			System.out.println("Error enviarNotificacionTope: " +e.getMessage());
		}
	}

	public void guardarClientesEmpresaEstacion(Long idEstacion, boolean stEstacion, boolean isNew) {

		if(isNew){
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" id as co_cliente_empresa ");
			query.append(" from clpb_cliente_empresa ");
			query.append(" where st_cliente_empresa = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and st_red_total = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			List<ClprClienteEstacion> listaClprClienteEstacion = new ArrayList<ClprClienteEstacion>();
			List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
			
			if(!list.isEmpty()){
				for (int j = 0; j < list.size(); j++) {
					
					Map<String, Object> objMap = list.get(j);
					Long coClienteEmpresa = new Long(objMap.get("CO_CLIENTE_EMPRESA").toString());
					
					ClprClienteEstacion bnestacion = new ClprClienteEstacion();				
					bnestacion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					bnestacion.setDaFechaCreacion(Calendar.getInstance());
					bnestacion.setCoClienteEmpresa(coClienteEmpresa);
					bnestacion.setCoEstacion(idEstacion.toString());
					bnestacion.setStClienteEstacion(Boolean.TRUE);
					
					listaClprClienteEstacion.add(bnestacion);
				}
				
				System.out.println("Lista" + listaClprClienteEstacion.size());		
				getHibernateTemplate().saveOrUpdateAll(listaClprClienteEstacion);
				getHibernateTemplate().flush();	
			}
			
		}else if(!stEstacion){ //si no es un nuevo registro y lo desactivan se dara de baja a la estacion con relacion al cliente
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" id as co_cliente_estacion ");
			query.append(" from clpr_cliente_estacion ");
			query.append(" where st_cliente_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and co_estacion = ").append(idEstacion);
			
			List<ClprClienteEstacion> listaClprClienteEstacion = new ArrayList<ClprClienteEstacion>();
			List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
			
			if(!list.isEmpty()){
				for (int j = 0; j < list.size(); j++) {
					
					Map<String, Object> objMap = list.get(j);
					Long coClienteEstacion = new Long(objMap.get("CO_CLIENTE_ESTACION").toString());
					
					ClprClienteEstacion bnestacion = new ClprClienteEstacion();
					bnestacion.setId(coClienteEstacion);
					bnestacion.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
					bnestacion.setDaFechaModificacion(Calendar.getInstance());
					bnestacion.setStClienteEstacion(Boolean.FALSE);
					
					listaClprClienteEstacion.add(bnestacion);
				}
				
				System.out.println("Lista" + listaClprClienteEstacion.size());		
				getHibernateTemplate().saveOrUpdateAll(listaClprClienteEstacion);
				getHibernateTemplate().flush();	
			}
		}
	}

	public void guardarClienteEmpresaPorLineaCredito(
			ClpbClienteEmpresa clienteEmpresa) {

		String[] arrayStr = new String[2];
		StringBuffer query = new StringBuffer();
		
		query.append(" update clpd_linea_credito ");
		query.append(" set ");
		query.append(" 		st_linea_credito  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion  = sysdate ");
		query.append(" where co_cliente_empresa = ").append(clienteEmpresa.getId());
		query.append("   and st_linea_credito='"+CLPConstantes.ST_VERDADERO+"' ");
		arrayStr[0] = query.toString();
		
		query = new StringBuffer();
		query.append(" update clpb_cliente_empresa ");
		query.append(" set ");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where id = ").append(clienteEmpresa.getId());
		arrayStr[1] = query.toString();

		ClpdLineaCredito lineaCredito = clienteEmpresa.getClpdLineaCredito();
		lineaCredito.setDaFechaCreacion(Calendar.getInstance());
		lineaCredito.setDaFechaOperacion(Calendar.getInstance());
		lineaCredito.setStLineaCredito(Boolean.TRUE);
		lineaCredito.setCoClienteEmpresa(clienteEmpresa.getId());
		lineaCredito.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
		
		jdbcTemplate.batchUpdate(arrayStr);
		getHibernateTemplate().save(lineaCredito);		
		getHibernateTemplate().flush();		
	}

	public List<BNClienteEmpresa> obtenerClienteEmpresasConLineaCredito(
			boolean esInicial) {

		StringBuffer sql = new StringBuffer();
		sql.append(" select * from ( ");

		sql.append(" select cliente.id as id, ");
		sql.append(" cliente.co_ruc as coRuc, ");
		sql.append(" cliente.de_cliente_empresa as deClienteEmpresa, ");
		sql.append(" cliente.de_alias as deAlias, ");
		sql.append(" cliente.de_email_notificacion_1 as deEmailNotificacion1, ");
		sql.append(" cliente.de_email_notificacion_2 as deEmailNotificacion2, ");
		sql.append(" cliente.st_cliente_empresa as habilitado, ");
		sql.append(" linea.co_tipo_linea_credito as coTipoLineaCredito, ");
		sql.append(" linea.va_linea_credito as vaLineaCredito ");
		sql.append(" from clpb_cliente_empresa cliente ");
		
		sql.append(" join clpd_linea_credito linea ");		
		sql.append(" on linea.co_cliente_empresa = cliente.id  ");
		sql.append(" where 1 = 1 ");
		
		sql.append(" and linea.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		
		if(!esInicial)
		sql.append(" and cliente.st_cliente_empresa ='"+CLPConstantes.ST_VERDADERO+"' ");
		
	    sql.append(" order by cliente.id desc) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);		
		return findListOfBeans(sql.toString(), null, BNClienteEmpresa.class);
	}

	public List<BNClienteEmpresa> busquedaClientesPorFiltrosConLineaCredito(
			String deClienteEmpresa, String coRuc, Long lineaCreditoMinima,
			Long lineaCreditoMaxima, String coTipoLineaCredito,
			String habilitado) {

		StringBuffer sql = new StringBuffer();
		sql.append(" select cliente.id as id, ");
		sql.append(" cliente.co_ruc as coRuc, ");
		sql.append(" cliente.de_cliente_empresa as deClienteEmpresa, ");
		sql.append(" cliente.de_alias as deAlias, ");
		sql.append(" cliente.de_email_notificacion_1 as deEmailNotificacion1, ");
		sql.append(" cliente.de_email_notificacion_2 as deEmailNotificacion2, ");
		sql.append(" cliente.st_cliente_empresa as habilitado, ");
		sql.append(" linea.co_tipo_linea_credito as coTipoLineaCredito, ");
		sql.append(" linea.va_linea_credito as vaLineaCredito ");
		sql.append(" from clpb_cliente_empresa cliente ");
		
		sql.append(" join clpd_linea_credito linea ");
		sql.append(" on linea.co_cliente_empresa = cliente.id  ");
		sql.append(" where 1 = 1 ");
		
		sql.append(" and linea.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"' ");
		
		if(StringUtils.isNotBlank(deClienteEmpresa.trim()))
			sql.append(" and upper(trim(cliente.de_cliente_empresa)) like upper(trim('%"+deClienteEmpresa.trim()+"%')) ");
		
		if(StringUtils.isNotBlank(coRuc.trim()))
			sql.append(" and upper(trim(cliente.co_ruc)) like upper(trim('%"+coRuc.trim()+"%')) ");
				
		if(StringUtils.isNotBlank(habilitado)&& !habilitado.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS))
			sql.append(" and cliente.st_cliente_empresa='"+habilitado+"' ");
		
		if(StringUtils.isNotBlank(coTipoLineaCredito))
			sql.append(" and linea.co_tipo_linea_credito='"+coTipoLineaCredito+"' ");

		if(null != lineaCreditoMinima) {
			sql.append(" and va_linea_credito >= ").append(lineaCreditoMinima);
		}
			
		if(null != lineaCreditoMaxima){
			sql.append(" and va_linea_credito <= ").append(lineaCreditoMaxima);
		}
		
		sql.append(" order by cliente.id desc ");
		
		System.out.println(sql.toString());
		List<BNClienteEmpresa> listaClientes= findListOfBeans(sql.toString(), null, BNClienteEmpresa.class);
		return listaClientes;
	}
}

